/*
 * @Description: 工具库
 * @Author: Cary
 * @Date: 2019-11-16 14:33:59
 * @FilePath: f:\node-project\cc-tools\src\utils\index.js
 */
const fs = require('fs')
const path = require('path')
const chalk = require('chalk')
import request from 'request'
const Queue = require('promise-queue-plus')
const q = Queue.Promise

export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
      time = parseInt(time)
    }
    if ((typeof time === 'number') && (time.toString().length === 10)) {
      time = time * 1000
    }
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    // Note: getDay() returns 0 on Sunday
    if (key === 'a') {
      return ['日', '一', '二', '三', '四', '五', '六'][value]
    }
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

 /**
  * 递归创建目录 同步方法
  * @param {path} dirname 
  * @param {*} mode 
  */
export function mkdirsSync(dirname, mode) {
  if(fs.existsSync(dirname)){
    return true
  }else{
    if(mkdirsSync(path.dirname(dirname), mode)){
      fs.mkdirSync(dirname)
      return true
    }
  }
}

/**
 * 下载文件
 * @param {String} uri 下载的 url
 * @param {*} filename 文件名字和目录
 * @param {*} callback 回调方法
 */
export function download(uri, filename, callback) {
  var stream = fs.createWriteStream(filename)
  request.head(uri, function(err, res, body) {
    if (uri) {
      request(uri).pipe(stream).on('close', callback)
    }
  })
}

/**
 * 使用彩色的字体输出控制台
 * @param {String} txt 
 */
export function make_red(txt) {
 return chalk.red(txt)
}

/**
 * 使用彩色的字体输出控制台
 * @param {String} txt 
 */
export function make_blue(txt) {
  return chalk.blue(txt)
}
 
/**
 * 使用彩色的字体输出控制台
 * @param {String} txt 
 */
export function make_yellow(txt) {
  return chalk.yellow(txt)
}
 
/**
 * 常用正则
 * @param {String} str // 字符串
 * @param {String} type //类型
 */
export function checkStr(str, type) {
  switch (type) {
    case 'phone':
      // 手机号码
      return /^1[3|4|5|6|7|8|9][0-9]{9}$/.test(str)
    case 'tel':
      // 座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str)
    case 'card':
      // 身份证
      return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(str)
    case 'pwd':
      // 密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
      return /^[a-zA-Z]\w{5,17}$/.test(str)
    case 'postal':
      // 邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str)
    case 'QQ':
      // QQ号
      return /^[1-9][0-9]{4,9}$/.test(str)
    case 'email':
      // 邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str)
    case 'money':
      // 金额(小数点2位)
      return /^\d*(?:\.\d{0,2})?$/.test(str)
    case 'URL':
      // 网址
      return /(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?/.test(
        str
      )
    case 'IP':
      // IP
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(
        str
      )
    case 'date':
      // 日期时间
      return (
        /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2})(?:\:\d{2}|:(\d{2}):(\d{2}))$/.test(
          str
        ) || /^(\d{4})\-(\d{2})\-(\d{2})$/.test(str)
      )
    case 'number':
      // 数字
      return /^[0-9]$/.test(str)
    case 'english':
      // 英文
      return /^[a-zA-Z]+$/.test(str)
    case 'chinese':
      // 中文
      return /^[\u4E00-\u9FA5]+$/.test(str)
    case 'lower':
      // 小写
      return /^[a-z]+$/.test(str)
    case 'upper':
      // 大写
      return /^[A-Z]+$/.test(str)
    case 'HTML':
      // HTML标记
      return /<("[^"]*"|'[^']*'|[^'">])*>/.test(str)
    default:
      return true
  }
}

/**
 * 消息列队
 * @return queue
 */
export function queue() {
  return Queue(3, {
    "retry": 3,               //Number of retries
    "retryIsJump": false,     //retry now? 
    "timeout": 1000           //The timeout period
  })
}

export function httpGet(url, callback) {
  request(url, callback)
}

/**
 * 数组去重
 * @param {*} a 
 * @param {*} b 
 */
export function distinct(arr) {
  return Array.from(new Set([...arr]))
}
